# 基础函数库
import numpy as np
# 导入画图库
import matplotlib.pyplot as plt
import seaborn as sns

from sklearn.linear_model import LogisticRegression


# Demo演示LogisticRegression分类
# 构造数据集
x_fearures = np.array([[-1, -2], [-2, -1], [-3, -2], [1, 3], [2, 1], [3, 2]])
y_label = np.array([0, 0, 0, 1, 1, 1])

# 调用逻辑回归模型
lr_clf = LogisticRegression()

lr_clf = lr_clf.fit(x_fearures, y_label)  # 拟合方程为y=w0+w1*x1+w2*x2

# 查看对应模型的W
print('the weight of Logistic Regression:', lr_clf.coef_)

print('the intercept(w0) of Logistic Regression:', lr_clf.intercept_)

# 可视化构造的数据样本点
plt.figure()
plt.scatter(x_fearures[:, 0], x_fearures[:, 1], c=y_label, s=50, cmap='viridis')
plt.title('Dataset')
# plt.show()

# 可视化决策边界
nx, ny = 200, 100
x_min, x_max = plt.xlim()  # 自动调整X/Y轴显示的数据
y_min, y_max = plt.ylim()  # 自动调整X/Y轴显示的数据

# numpy.meshgrid()函数会根据输入的数组生成网格坐标，返回一组与输入数组形状对应的二维数组，每个数组代表一个维度的坐标。这些数组可以一起使用，以表示多维空间中的网格点。
x_grid, y_grid = np.meshgrid(np.linspace(x_min, x_max, nx), np.linspace(y_min, y_max, ny))

# predict_proba返回一个预测分类问题的列表  np.c用于连接两个矩阵
z_proba = lr_clf.predict_proba(np.c_[x_grid.ravel(), y_grid.ravel()])
z_proba = z_proba[:, 1].reshape(x_grid.shape)
plt.contour(x_grid, y_grid, z_proba, [0.5], linewidths=2., colors='blue')
plt.show()